package com.ktjy.aop;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;

import java.util.Arrays;
import java.util.Random;

/**
 * @return 13141
 * 2025/6/23
 * 10:47
 */
@Aspect // 表示这是一个切面类
@Component // 结合扫描包，生成 bean 对象到 IoC容器中
public class CheckAspect {
    private static final Logger log = LoggerFactory.getLogger(CheckAspect.class);

    // 定义切入点
    @Pointcut("execution(public boolean printing(com.ktjy.entity.Print))")
    public void ptPrint(){}
    /**
     * 前置增强-自检操作
     */
    @Before(value = "ptPrint()")
    public void before(JoinPoint jp) {
        log.info("【CheckAspect 前置增强】正在调用 {} 的 {} 方法，方法入参：{}",
                jp.getTarget(), jp.getSignature().getName(), Arrays.toString(jp.getArgs()));
    }

    /**
     * 后置增强-正常打印
     */
    @AfterReturning(value = "ptPrint()", returning = "result")
    public void afterReturning(JoinPoint jp, Object result) {
        log.info("【CheckAspect 后置增强】正在调用 {} 的 {} 方法，方法返回值：{}",
                jp.getTarget(), jp.getSignature().getName(), result);
    }

    /**
     * 异常抛出增强
     */
    @AfterThrowing(value = "ptPrint()", throwing = "e")
    public void afterThrowing(JoinPoint jp, Throwable e) {
        log.info("【CheckAspect 异常抛出增强】正在调用 {} 的 {} 方法, 返回：{}",
                jp.getTarget(), jp.getSignature().getName(), e.getMessage());
    }

    /**
     * 最终增强
     */
    @After(value = "ptPrint()")
    public void after(JoinPoint jp) {
        log.info("【CheckAspect 最终增强】正在调用 {} 的 {} 方法",
                jp.getTarget(), jp.getSignature().getName());
    }
}
